import { defineStore } from "pinia";
import piniaPersistConfig from "@/config/piniaPersist.js";
import isEqual from 'lodash/isEqual';
import { isEmpty } from "@/utils/index.js"
// 获取数据库引用
const db = uniCloud.database();
// 获取数据库的集合
const systemApi = uniCloud.importObject('admin-system', {
	customUI: true // 取消自动展示的交互提示界面
})
const applicationApi = uniCloud.importObject('qc-application', {
	customUI: true // 取消自动展示的交互提示界面
})
const articleApi = uniCloud.importObject('qc-article', {
	customUI: true // 取消自动展示的交互提示界面
})
const vipApi = uniCloud.importObject('qc-vip', {
	customUI: true // 取消自动展示的交互提示界面
})
const userApi = uniCloud.importObject('qc-user', { customUI: true })
import { LoginStore } from "@/store/modules/login.js";

/***
 * @description: 存放缓存数据，避免每次请求造成的页面闪缩
 * @param {*}
 * @return {*}
 * @author: white_queen
 */
export const ConfigStore = defineStore({
	// id: 必须的，在所有 Store 中唯一 将来Pinia会把所有的容器挂载到根容器，每个容器的名字就是这里的ID
	id: "ConfigStore",
	state: () => ({
		config: {}, //全局系统配置
		appMenu: [], //app首页菜单
		publish: [], //发布菜单/管理菜单
		classification: { //分类
			// '0': 发布文章,
			// '1': 发布应用,
		},
		vipList: [], //会员权益
		notice: [], //公告
		// function: [{
		// 	key: 'config',
		// 	fn: 'getSystemConfig'
		// }, {
		// 	key: 'publish',
		// 	fn: 'getPublish'
		// }, {
		// 	key: 'classification',
		// 	fn: 'getClassification'
		// }, {
		// 	key: 'vipList',
		// 	fn: 'getVip'
		// }, {
		// 	key: 'notice',
		// 	fn: 'getNotice'
		// }],
		teamNum: [], //团队人数
		taskData: [], //每日任务数据
		storageTime: 0, //存放一个过期的时间搓
		noticeState: true, //公告不在提示状态
		noticeTime: 0, //公告不在提示时间
	}),

	getters: {
		// 获取config配置
		getConfig(state) {
			return state.config
		}
	},
	actions: {
		// 初始化请求
		getRequest() {
			// 使用时间进行定时缓存
			const currentTime = new Date().getTime();
			// 调用公告函数
			this.displayNotice()
			this.getSystemConfig()
			this.getPublish()
			this.getClassification()
			this.getVip()
			this.getNotice()
		},
		// 显示或隐藏公告的函数
		displayNotice(value) {
			if (value == '不在提醒') {
				return this.noticeState = false
			}
			// 如果时间戳和状态都存在
			const currentTime = new Date().getTime();
			// const TEN_MINUTES = 5 * 60 * 1000; // 10分钟
			const TEN_MINUTES = 24 * 60 * 60 * 1000; // 24小时
			// 如果当前时间超出了有效期（10分钟），或者状态为隐藏，则显示公告
			if (currentTime - this.noticeTime > TEN_MINUTES || this.noticeState === true) {
				// 把时间保存
				this.noticeTime = new Date().getTime();
				this.noticeState = true
				// 显示公告的逻辑
			}
		},

		// 下线通知
		loginOffline() {
			LoginStore().setUserInfo({})
			LoginStore().updateHasLogin()
			const currentDate = new Date();
			const currentHours = currentDate.getHours(); // 获取当前小时数（0 到 23）
			let currentMinutes = currentDate.getMinutes(); // 获取当前分钟数（0 到 59）
			if (currentMinutes < 10) {
				currentMinutes = `0${currentMinutes}`; // 如果分钟数小于 10，在前面添加 '0'
			}
			uni.showModal({
				title: '下线通知',
				content: "您的账号于" + `${currentHours}:${currentMinutes}` + "正在被其它设备登录，当前设备已下线。如果这不是你的本人操作，那么你的账户密码可能已经泄露，请尽快重新登录并修改密码。",
				cancelColor: "#7F7F7F",
				confirmText: "重新登录",
				cancelText: "退出",
				success(res) {
					if (res.confirm) {
						//重新登录逻辑
						LoginStore().logout()
					} else {
						//退出逻辑
						LoginStore().logout()
					}
				},
				fail(err) {
					console.log(err)
				}
			})
		},

		// 获取全局配置
		async getSystemConfig() {
			this.storageTime = new Date().getTime();
			try {
				const res = await systemApi.getConfiguration()
				// 如果本地存储的数据为空，获取返回的数据跟本地存储的数据不一致，就重新赋值
				if (JSON.stringify(this.config) == "{}" || !isEqual(this.config, res.data)) {
					this.config = res.data || {}
				}
			} catch (e) {
				this.config = {}
				console.error(e);
			}
		},
		// 获取发布管理配置项目
		async getPublish() {
			try {
				const res = await articleApi.getPublish()
				// 如果本地存储的数据为空，获取返回的数据跟本地存储的数据不一致，就重新赋值
				if (this.publish.length == 0 || !isEqual(this.publish, res.data)) {
					this.publish = res.data || []
				}
			} catch (e) {
				this.publish = []
				console.error(e);
			}
		},
		// 获取分类选项
		async getClassification() {
			try {
				let typeList = {}
				for (let i = 0; i < 2; i++) {
					const res = await articleApi.getCategories({ publish_type: i + '' })
					typeList[i] = res.data
				}
				this.classification = typeList || {}
			} catch (e) {
				this.classification = {}
				console.error(e);
			}
		},
		// 获取弹窗公告
		async getNotice() {
			try {
				// #ifdef APP
				const res = await applicationApi.getNotice({ pageNum: 1, pageSize: 1 })
				// 如果本地存储的数据为空，或者返回的数据跟本地存储的数据不一致，就重新赋值
				if (JSON.stringify(this.notice) == "{}" || !isEqual(this.notice, res.data)) {
					this.noticeState = true
					this.notice = res.data.filter(vm => vm.status)
					uni.navigateTo({
						url: `/pages/notice/notice`,
						fail: (err) => {
							console.error('弹出公告失败', err)
						}
					})
				}
				// #endif
			} catch (e) {
				this.notice = {}
				console.error(e);
			}
		},
		// 获取会员权益
		async getVip() {
			try {
				const res = await vipApi.getVip()
				// 如果本地存储的数据为空，获取返回的数据跟本地存储的数据不一致，就重新赋值
				this.vipList = res.data || []
			} catch (e) {
				this.vipList = []
				console.error(e);
			}
		},
		//获取团队人数
		async getInvitedTree() {
			try {
				const res = await userApi.getInvitedTree({ user_id: LoginStore().userInfo._id })
				// 如果本地存储的数据为空，获取返回的数据跟本地存储的数据不一致，就重新赋值
				if (this.teamNum?.length == 0 || !isEqual(this.teamNum, res.data)) {
					this.teamNum = res.data
				}
			} catch (e) {
				this.teamNum = []
				console.error(e);
			}
		},
	},
	// 给GlobalState模块开启持久化
	unistorage: piniaPersistConfig("ConfigStore")
});